home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / xpandisk.zip / XPANDISK.ASM < prev    next >
Assembly Source File  |  1988-10-31  |  38KB  |  864 lines

  1. ;  XpanDisk is a virtual disk device driver for expanded memory.
  2. ;  The driver has the capability of releasing memory allocated to
  3. ;  its drive, making it available to other applications.  All data
  4. ;  is lost if the drive is resized.  XPANBOSS.COM is the control
  5. ;  program for the XPANDISK.SYS driver. PC Magazine 10-31-88
  6.  
  7. _TEXT          SEGMENT PUBLIC 'CODE'
  8.                ASSUME  CS:_TEXT,DS:_TEXT
  9.                ASSUME  ES:_TEXT,SS:_TEXT
  10.                ORG     0H
  11.  
  12. ;************* DEVICE_HEADER *************;
  13.  
  14. POINTER        DD      -1                    ;Minus one indicates one driver.
  15. ATTRIBUTE      DW      0100000000000000B     ;Block device with IOCTL support.
  16. DEVICE_STAG    DW      STRATEGY              ;Pointer to strategy procedure.
  17. DEVICE_INT     DW      INTERRUPT             ;Pointer to interrupt procedure.
  18. DEVICE_NAME    DB      1, 7 DUP (?)          ;One unit.
  19.  
  20. REQUEST_HEADER         STRUC
  21.  HEADER_LENGTH          DB      ?
  22.  UNIT_CODE              DB      ?
  23.  COMMAND_CODE           DB      ?
  24.  STATUS                 DW      ?
  25.  RESERVED               DQ      ?
  26. REQUEST_HEADER         ENDS
  27.  
  28. INIT_PACKET            STRUC
  29.  INIT_HEADER            DB      (TYPE REQUEST_HEADER) DUP(?)
  30.  UNITS                  DB      ?
  31.  ENDING_OFFSET          DW      ?
  32.  ENDING_SEGMENT         DW      ?
  33.  ARGUMENTS_OR_ARRAY_OFF DW      ?
  34.  ARGUMENTS_OR_ARRAY_SEG DW      ?
  35. INIT_PACKET    ENDS
  36.  
  37. MEDIA_CHECK_PACKET     STRUC
  38.  MEDIA_CHECK_HEADER     DB      (TYPE REQUEST_HEADER) DUP(?)
  39.  CHECK_MEDIA_DESCRIPTOR DB      ?
  40.  RETURN_BYTE            DB      ?
  41. MEDIA_CHECK_PACKET     ENDS
  42.  
  43. BUILD_BPB_PACKET       STRUC
  44.  BUILD_BPB_HEADER       DB      (TYPE REQUEST_HEADER) DUP(?)
  45.  BPB_MEDIA_DESCRIPTOR   DB      ?
  46.  BPB_TRANSFER_ADDRESS   DD      ?
  47.  BPB_OFFSET             DW      ?
  48.  BPB_SEGMENT            DW      ?
  49. BUILD_BPB_PACKET       ENDS
  50.  
  51. INPUT_OUTPUT_PACKET    STRUC
  52.  INPUT_OUTPUT_HEADER    DB      (TYPE REQUEST_HEADER) DUP(?)
  53.  IO_MEDIA_DESCRIPTOR    DB      ?
  54.  TRANSFER_OFFSET        DW      ?
  55.  TRANSFER_SEGMENT       DW      ?
  56.  BYTE_OR_SECTOR_COUNT   DW      ?
  57.  STARTING_SECTOR        DW      ?
  58. INPUT_OUTPUT_PACKET    ENDS
  59.  
  60. CR             EQU     13
  61. LF             EQU     10
  62. CTRL_Z         EQU     26
  63. SPACE          EQU     32
  64. BOX            EQU     254
  65.  
  66. DONE              EQU     0100H             ;STATUS CODES
  67. WRITE_PROTECT     EQU     8000H
  68. UNKNOWN_UNIT      EQU     8001H
  69. DEVICE_NOT_READY  EQU     8002H
  70. UNKNOWN_COMMAND   EQU     8003H
  71. SECTOR_NOT_FOUND  EQU     8008H
  72.  
  73. MAX_COMMAND    EQU     12
  74. EMM_FLAG       DB      1
  75. REQUEST_PACKET LABEL   DWORD
  76. REQUEST_OFFSET DW      ?
  77. REQUEST_SEG    DW      ?
  78.  
  79. ;-----------------------------------------------------------------------------;
  80. ; The only task of the strategy is to save the pointer to the request header. ;
  81. ;-----------------------------------------------------------------------------;
  82. STRATEGY       PROC    FAR
  83.  
  84.                MOV     CS:REQUEST_OFFSET,BX    ;Request header address is
  85.                MOV     CS:REQUEST_SEG,ES       ; passed in ES:BX.
  86.                RET
  87.  
  88. STRATEGY       ENDP
  89.  
  90. ;------------------------------------------------------------------------;
  91. ; The interrupt procedure will be called immediately after the strategy. ;
  92. ;------------------------------------------------------------------------;
  93. INTERRUPT      PROC    FAR
  94.  
  95.                PUSH    AX                      ;Responsible for all registers.
  96.                PUSH    BX
  97.                PUSH    CX
  98.                PUSH    DX
  99.                PUSH    DS
  100.                PUSH    ES
  101.                PUSH    SI
  102.                PUSH    DI
  103.                PUSH    BP
  104.                PUSHF
  105.  
  106.                CLD                             ;All string moves forward.
  107.                PUSH    CS                      ;Point to our data.
  108.                POP     DS
  109.  
  110.                CMP     EMM_FLAG,1              ;Was EMM found?
  111.                MOV     AX,UNKNOWN_UNIT         ;Assume no.
  112.                JNZ     EXIT                    ;If no expanded manager, exit.
  113.  
  114.                LES     DI,REQUEST_PACKET       ;Retrieve request header pointer.
  115.                MOV     BL,ES:COMMAND_CODE[DI]  ;Retrieve command.
  116.                CMP     BL,MAX_COMMAND          ;Do we support it?
  117.                MOV     AX,UNKNOWN_COMMAND      ;Assume no.
  118.                JA      EXIT                    ;If out of range, exit.
  119.  
  120.                XOR     BH,BH                   ;Zero in high half of command.
  121.                SHL     BX,1                    ;Convert to word pointer.
  122.                CALL    DISPATCH_TABLE[BX]      ;Go do our thing.
  123.  
  124. EXIT:          LDS     DI,REQUEST_PACKET       ;Retrieve request header pointer.
  125.                OR      AX,DONE
  126.                MOV     STATUS[DI],AX           ;Tell DOS we are done.
  127.  
  128.                POPF                            ;Restore rest of registers.
  129.                POP     BP                      ;Restore registers.
  130.                POP     DI
  131.                POP     SI
  132.                POP     ES
  133.                POP     DS
  134.                POP     DX
  135.                POP     CX
  136.                POP     BX
  137.                POP     AX
  138.                RET                             ;Far return back to DOS.
  139.  
  140. INTERRUPT      ENDP
  141.  
  142. EVEN
  143. MIN_RESIDENT   EQU     $
  144.  
  145. DISPATCH_TABLE LABEL   WORD
  146.  
  147. DW    INIT,          MEDIA_CHECK,   BUILD_BPB,    IOCTL_INPUT, INPUT
  148. DW    INPUT_NOWAIT,  INPUT_STATUS,  INPUT_FLUSH,  OUTPUT
  149. DW    OUTPUT_VERIFY, OUTPUT_STATUS, OUTPUT_FLUSH, IOCTL_OUTPUT
  150.  
  151. BOOT_RECORD            LABEL   BYTE
  152.  
  153.                        DB      3 DUP (0)
  154.                        DB      "XPANDISK"
  155.  
  156. BIOS_PARAMETER_BLOCK   LABEL   BYTE
  157.  
  158. BYTES_PER_SECTOR       DW      SECTOR_SIZE_DEFAULT
  159. SECTORS_PER_CLUSTER    DB      1
  160. RESERVED_SECTORS       DW      1
  161. NUMBER_OF_FATS         DB      1
  162. ROOT_DIRECTORY_ENTRIES DW      ROOT_ENTRIES_DEFAULT
  163. TOTAL_SECTORS          DW      1024 / SECTOR_SIZE_DEFAULT * DISK_SIZE_DEFAULT
  164. MEDIA_DESCRIPTOR_BYTE  DB      MEDIA_DESCRIPTOR
  165. SECTORS_PER_FAT        DW      1
  166. SECTORS_PER_TRACK      DW      8
  167. NUMBER_OF_HEADS        DW      1
  168. HIDDEN_SECTORS         DW      0
  169.  
  170. BOOT_RECORD_LENGTH     EQU     $ - BOOT_RECORD
  171.  
  172. MEDIA_DESCRIPTOR       EQU     0FEH
  173. DISK_SIZE_DEFAULT      EQU     64
  174. DISK_SIZE_MINIMUM      EQU     16
  175. DISK_SIZE_MAXIMUM      EQU     32 * 1024
  176. SECTOR_SIZE_DEFAULT    EQU     256
  177. SECTOR_SIZE_MINIMUM    EQU     128
  178. SECTOR_SIZE_MAXIMUM    EQU     512
  179. ROOT_ENTRIES_DEFAULT   EQU     64
  180. ROOT_ENTRIES_MINIMUM   EQU     4
  181. ROOT_ENTRIES_MAXIMUM   EQU     512
  182.  
  183. DISK_SIZE_TEMP         DW      DISK_SIZE_DEFAULT
  184. SECTOR_SIZE_TEMP       DW      SECTOR_SIZE_DEFAULT
  185. ROOT_ENTRIES_TEMP      DW      ROOT_ENTRIES_DEFAULT
  186. DISK_SIZE              DW      DISK_SIZE_DEFAULT
  187. PARA_FLAG              DB      ?
  188. READ_ONLY_FLAG         DB      0
  189. FORMAT_FLAG            DB      1
  190.  
  191. BPB_ARRAY      DW      BIOS_PARAMETER_BLOCK
  192.  
  193. VOLUME_LABEL   LABEL   BYTE
  194.                DB      "PCMAG",SPACE,BOX,SPACE,"MJM"
  195.                DB      28H
  196.                DT      0
  197.                DW      6000H                   ;Date  July 1, 1988
  198.                DW      10E1H                   ;Time  12:00pm
  199.                DB      6 DUP (0)
  200.  
  201. VOLUME_LENGTH  EQU     $ - VOLUME_LABEL
  202.  
  203. PASSWORD               DB      "PC Magazine Productivity"
  204. PASSWORD_LENGTH        EQU     $ - PASSWORD
  205.  
  206. DISK_SIZE_MSG          DB      CR,LF,"Disk Size         ",0
  207. SECTOR_SIZE_MSG        DB  "K",CR,LF,"Sector Size       ",0
  208. DIRECTORY_ENTRIES_MSG  DB      CR,LF,"Directory Entries ",0
  209.  
  210. MEDIA_NOT_CHANGED      EQU      1
  211. MEDIA_CHANGED          EQU     -1
  212. TWELVE_BIT_FAT         EQU     4087
  213. ONE_K                  EQU     1024
  214. SIXTEEN_K              EQU     16384
  215. THIRTY_TWO_K           EQU     32768
  216.  
  217. INPUT_COMMAND  EQU     4
  218. COMMAND        DB      ?
  219.  
  220. FRAME_SEGMENT  DW      ?
  221. HANDLE         DW      ?
  222. PAGES          DW      ?
  223.  
  224. ;--------------------------------------------------------------;
  225. ; Character device functions; ignore and return no error code. ;
  226. ;--------------------------------------------------------------;
  227. INPUT_NOWAIT:
  228. IN